(()=>{ 
  // 接口  interface 对值所具有的结构进行类型检查,一种约束   
  // 修饰：（readonly  只读 ） （？可有可无） 无任何修饰的属性代表必须有，属性使用接口赋值时不可添加定义时以外的属性, 类可以有接口以外的属性、方法
  // 如果接口未定义任何属性约束，则赋值时无任何约束，用在属性赋值限制时persons对象上的属性无法修改 例：类型“IPersons”上不存在属性“age”（类实现的方式可以修改）
  // interface Persons{
  //   readonly id:number
  //   name:string
  //   age:number
  //   sex?:string
  // }
  // const persons:Persons = {
  //   id:1,
  //   name:'zs',
  //   age:11,
  //   sex:'男' //该属性可有可无
  //   // address:''  //错误
  // }
  // persons.age= 7
  // console.log(persons)

  // interface IPersons{

  // }
  // const persons:IPersons = {
  //   id:1,
  //   name:'zs',
  //   age:11,
  //   sex:'男', //该属性可有可无
  //   address:''  //错误
  // }
  // persons.age = 7 //错误，类型“IPersons”上不存在属性“age”
  // console.log(persons)

  // 函数类型
  // interface Iserch{
  //   // 调用签名
  //   (source: string, subString: string): boolean
  // }
  // const serch:Iserch = function (source: string, subString: string): boolean{
  //   return source.search(subString) > -1
  // }
  // console.log( serch('0.15','.'))
  // 类 类型 类除了实现接口的约束外，还可以有自己的属性/方法
  interface Alarm{
    fly()
  }
  interface Light{
    light()
  }
  // 类可以实现多个接口  implements
  // class Persons implements Alarm,Light{
  //   fly() {
  //     console.log('666')
  //   }
  //   light() {
  //     console.log(777)
  //   }
  // }
  // let p = new Persons()
  // p.fly()
  // p.light()

  // 接口继承接口 
  interface LightableAlarm extends Alarm,Light{
    aa()
  }
  // 实现LightableAlarm接口相当于实现了上面三个接口
  class Persons implements LightableAlarm{
    aa(){
      console.log('aa')
    }
    fly() {
      console.log('fly')
    }
    light() {
      console.log('light')
    }
  }
  // let p = new Persons()
  // p.aa()
  // p.fly()
  // p.light()




})()